<html>
    <head>
        <title>添加 ViewComponent类</title>
    </head>
    <body>
        <script>
            /*
                2、添加ViewComponent类

                                                        将 ViewComponent 类添加到 ViewComponents/PriorityListViewComponent.cs：
                                                        
                                                                using Microsoft.AspNetCore.Mvc;
                                                                using Microsoft.EntityFrameworkCore;
                                                                using ViewComponentSample.Models;

                                                                namespace ViewComponentSample.ViewComponents;

                                                                public class PriorityListViewComponent : ViewComponent  // 创建视图组件类。
                                                                {
                                                                    private readonly ToDoContext db;

                                                                    // 构造函数注入 ToDoContext 实例。
                                                                    public PriorityListViewComponent(ToDoContext context) => db = context;

                                                                    // 实现 InvokeAsync 方法。（调用方法）
                                                                    public async Task<IViewComponentResult> InvokeAsync( int maxPriority, bool isDone)  // 自己可以给此函数定义任意数量参数
                                                                    {
                                                                        var items = await GetItemsAsync(maxPriority, isDone);
                                                                        return View(items);  // 通过ViewModel 传值，没有视图名称参数，则使用Default.cshtml作为视图名称。

                                                                    }

                                                                    // 私有方法
                                                                    private Task<List<TodoItem>> GetItemsAsync(int maxPriority, bool isDone)
                                                                    {
                                                                        return db!.ToDo!.Where(x => x.IsDone == isDone &&
                                                                                            x.Priority <= maxPriority).ToListAsync();
                                                                    }
                                                                }

                                                        ★、代码说明：
                                                                    ①、视图组件类可以包含在项目的任意文件夹中。

                                                                    ②、因为类名 PriorityListViewComponent 以后缀 ViewComponent 结尾，所以运行时将在从视图引用类组件时使用字符串 "PriorityList" 作为名称。

                                                                    ③、[ViewComponent] 特性可以更改用于引用视图组件的名称。 、

                                                                                例如，类可以使用以下 [ViewComponent] 属性命名为 XYZ：

                                                                                    [ViewComponent(Name = "PriorityList")]
                                                                                    public class XYZ : ViewComponent

                                                                                上述代码中的[ViewComponent]特性告知视图组件选择器：

                                                                                    -1- 查找与组件相关联的视图时，视图的名称为 PriorityList。

                                                                                    -2- 从视图中引用类组件时的字符串为 "PriorityList"

                                                                    ④、组件使用依赖注入以使数据上下文可用

                                                                    ⑤、InvokeAsync 公开可以从视图调用的方法，且可以采用任意数量的参数。

                                                                    ⑥、InvokeAsync 方法返回满足 isDone 和 maxPriority 参数的 ToDo 项集。
            */
        </script>
    </body>
</html>